/**
 * Created on Jun 9, 2008
 *
 * Copyright (C) Azureus Software, Inc, All Rights Reserved.
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License only.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA 
 */

package com.aelitis.azureus.ui.selectedcontent;

import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.torrent.TOTorrent;

import com.aelitis.azureus.core.torrent.PlatformTorrentUtils;
import com.aelitis.azureus.util.PlayUtils;

/**
 * @author TuxPaper
 * @created Jun 9, 2008
 * 
 */
public class SelectedContentV3 implements ISelectedContent {

    private final SelectedContent content;

    private boolean isPlatformContent;

    private boolean canPlay;

    private String thumbURL;

    private byte[] imageBytes;

    private DownloadUrlInfo downloadInfo;

    // if you add more fields here be sure to amend 'sameAs' logic below

    public SelectedContentV3(SelectedContent content) {
        this.content = content;
        this.setDownloadManager(content.getDownloadManager());
    }

    public SelectedContentV3() {
        content = new SelectedContent();
    }

    public SelectedContentV3(String hash, String displayName, boolean isPlatformContent, boolean canPlay) {
        this.isPlatformContent = isPlatformContent;
        this.canPlay = canPlay;
        content = new SelectedContent(hash, displayName);
    }

    public SelectedContentV3(DownloadManager dm) throws Exception {
        content = new SelectedContent();
        setDownloadManager(dm);
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#getDisplayName()
    public String getDisplayName() {
        return content.getDisplayName();
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#getDM()
    public DownloadManager getDownloadManager() {
        return content.getDownloadManager();
    }

    public int getFileIndex() {
        return content.getFileIndex();
    }

    public TOTorrent getTorrent() {
        return content.getTorrent();
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#getHash()
    public String getHash() {
        return content.getHash();
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#setDisplayName(java.lang.String)
    public void setDisplayName(String displayName) {
        content.setDisplayName(displayName);
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#setDM(org.gudy.azureus2.core3.download.DownloadManager)
    public void setDownloadManager(DownloadManager dm) {
        content.setDownloadManager(dm);
        if (dm != null) {
            setTorrent(dm.getTorrent());

            setDisplayName(PlatformTorrentUtils.getContentTitle2(dm));
        }
    }

    public void setTorrent(TOTorrent torrent) {
        content.setTorrent(torrent);

        if (torrent != null) {

            try {
                setHash(torrent.getHashWrapper().toBase32String());
            } catch (Exception e) {
                setHash(null);
            }
            setPlatformContent(PlatformTorrentUtils.isContent(torrent, true));
            setDisplayName(PlatformTorrentUtils.getContentTitle(torrent));
            setCanPlay(PlayUtils.canUseEMP(torrent, -1));
            setImageBytes(PlatformTorrentUtils.getContentThumbnail(torrent));
        }
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#setHash(java.lang.String)
    public void setHash(String hash) {
        content.setHash(hash);
    }

    public void setHash(String hash, boolean isPlatformContent) {
        content.setHash(hash);
        setPlatformContent(isPlatformContent);
    }

    public boolean isPlatformContent() {
        return isPlatformContent;
    }

    public void setPlatformContent(boolean isPlatformContent) {
        this.isPlatformContent = isPlatformContent;
    }

    public boolean canPlay() {
        return canPlay;
    }

    public void setCanPlay(boolean canPlay) {
        this.canPlay = canPlay;
    }

    public String getThumbURL() {
        return thumbURL;
    }

    public void setThumbURL(String thumbURL) {
        this.thumbURL = thumbURL;
    }

    /**
     * @param imageBytes
     *            the imageBytes to set
     */
    public void setImageBytes(byte[] imageBytes) {
        this.imageBytes = imageBytes;
    }

    /**
     * @return the imageBytes
     */
    public byte[] getImageBytes() {
        return imageBytes;
    }

    // @see com.aelitis.azureus.ui.selectedcontent.ISelectedContent#getDownloadInfo()
    public DownloadUrlInfo getDownloadInfo() {
        return downloadInfo;
    }

    // @see
    // com.aelitis.azureus.ui.selectedcontent.ISelectedContent#setDownloadInfo(com.aelitis.azureus.ui.selectedcontent.SelectedContentDownloadInfo)
    public void setDownloadInfo(DownloadUrlInfo info) {
        this.downloadInfo = info;
    }

    public boolean sameAs(ISelectedContent _other) {
        if (_other == this) {

            return (true);
        }

        if (_other instanceof SelectedContentV3) {

            SelectedContentV3 other = (SelectedContentV3) _other;

            if (!content.sameAs(other.content)) {

                return (false);
            }

            if (isPlatformContent != other.isPlatformContent || canPlay != other.canPlay) {

                return (false);
            }

            if (thumbURL != other.thumbURL) {

                if (thumbURL == null || other.thumbURL == null || !thumbURL.equals(other.thumbURL)) {

                    return (false);
                }
            }

            if (imageBytes != other.imageBytes) {

                return (false);
            }

            if (downloadInfo != other.downloadInfo) {

                if (downloadInfo == null || other.downloadInfo == null || !downloadInfo.sameAs(other.downloadInfo)) {

                    return (false);
                }
            }

            return (true);
        }

        return (false);
    }
}
